/***************************************************************************
 *   Copyright (C) 2009 by Zheng Yonglei
 *   zhengyonglei@gmail.com   *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/

#ifndef __STATICMODULE_H
#define __STATICMODULE_H

#include <iostream>
#include <cassert>

template <class T>
class StaticModule
{
protected:
	static T* s_instance;

public:
	static void init()
	{
		if (s_instance)
			assert(0);

		s_instance=new T;
	}

	static T& getInstance()
	{
		if (s_instance == 0)
			assert(0);

		return *s_instance;
	}

	static T* getInstancePtr()
	{
		if (s_instance == 0)
		{
			assert(0);
		}
		return s_instance;
	}

	static void destroy()
	{
		if (s_instance == 0)
		{
			assert(0);
		}
		delete s_instance;
		s_instance = NULL;
	}
};

template <class T>
T* StaticModule<T>::s_instance = 0;

#endif //__STATICMODULE_H
